/**
 * Created by Panda on 04/11/2016
 */
(function () {
    'use strict';

    angular
        .module('com.akxx.aqzyk')
        .service('Resource', Resource);


    /** @ngInject */
    function Resource($q, $resource, Storage, APP) {

        /**
         * 创建一个承诺
         * @param _func,$resource中待执行的函数
         * @param param,_func的参数
         * @return promise对象
         * */
        function createPromise(_func, param) {
            var deferred = $q.defer();  //通过$q.defer()创建一个deferred延迟对象，在创建一个deferred实例时，也会创建出来一个派生的promise对象，使用deferred.promise就可以检索到派生的promise。

            deferred.notify();  //延迟对象的notify方法。

            if (!_func) {
                deferred.reject("resource function error");
            } else {
                _func(param, function (res) {
                    if (res.success) {
                        deferred.resolve(res);
                    } else {
                        deferred.reject(res.message);
                    }
                }, function () {
                    deferred.reject("500");
                });
            }

            return deferred.promise;  //返回deferred实例的promise对象
        }

        function createResource(_func) {
            var submitting = false;
            return function (data) {
                if (!submitting || data.async) {
                    submitting = true;
                    return createPromise(_func, data).then(function (res) {
                        submitting = false;
                        return res;
                    });
                }
            }
        }

        return function (url) {
            var user = Storage.getUser();
            if(!_.isEmpty(user)){
                url += ";jsessionid=" + user.jsessionid;
            }
            var $r = $resource(APP.url.host + url, {}, {update: {method: 'PUT', isArray: false}});
            //时间关系，写的粗糙一点
            var resource = {};

            var funcNames = ["get", "save", "delete", "update"];
            for (var i in funcNames) {
                var name = funcNames[i];
                resource[name] = createResource($r[name]);
            }

            return resource;
        }
    }


})();
